
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Java中的缓存技术Guava Cache,Caffeine,Redis - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Java中的缓存技术Guava Cache,Caffeine,Redis - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">Guava Cache/Caffeine与Redis在部署模式和适用范围上有何根本区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Guava Cache和Caffeine是本地内存缓存库，仅支持单机模式，内嵌于单个JVM应用中。它们适用于单机应用或微服务内部缓存。而Redis是一个独立的、分布式的内存数据存储系统，支持通过集群（Cluster）和哨兵（Sentinel）模式进行部署，适用于需要跨服务器共享缓存、高可用和水平扩展的大规模系统。</div>
          </div>
          <div class="card-source">来源: Guava Cache vs Caffeine vs Redis对比 - 4. 分布式与扩展性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Guava Cache提供的两种主要基于时间的过期策略是什么，它们有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">两种策略是`expireAfterWrite`和`expireAfterAccess`。`expireAfterWrite`指缓存项在写入后一定时间后过期，适用于生命周期明确的数据。`expireAfterAccess`指缓存项在最后一次访问后一定时间后过期，适用于需要保留频繁访问数据的场景。</div>
          </div>
          <div class="card-source">来源: Guava Cache - 2.1 自动过期与回收策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Caffeine采用了什么高级缓存回收算法来提升性能，其优势是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Caffeine内部使用了Window Tiny LRU算法。该算法优化了缓存的回收策略，可以根据内存使用情况自适应地回收缓存项，在高并发场景中能够更好地平衡内存消耗和缓存命中率，从而避免内存占用过高或频繁回收带来的开销。</div>
          </div>
          <div class="card-source">来源: Caffeine - 2.5 自定义回收策略</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Redis提供了哪两种主要的持久化机制？请简述它们的核心思想和优缺点。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis提供RDB（快照）和AOF（追加文件）两种持久化方式。RDB是定期将数据库在某个时间点的快照保存到磁盘，优点是效率高，但若系统崩溃会丢失最近一次快照后的数据。AOF是通过记录每次写操作到文件，优点是数据丢失可能性小，但性能开销相对较大。</div>
          </div>
          <div class="card-source">来源: Redis - 4. 持久化机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Caffeine的`refreshAfterWrite`特性与`expireAfterWrite`有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`expireAfterWrite`是在缓存项写入一段时间后直接使其过期失效。而`refreshAfterWrite`支持在缓存项过期之前自动触发刷新操作，这对于需要保持数据时效性的场景非常有用，可以避免因缓存过期导致用户请求等待数据重新加载。</div>
          </div>
          <div class="card-source">来源: Caffeine - 2.4 缓存刷新</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">根据文档建议，在哪些场景下应优先选择使用Redis作为缓存方案？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当应用是分布式的，需要在多台机器间共享缓存；当应用需要缓存数据持久化以在系统重启后恢复；或是在需要处理大规模数据存储和高并发请求的场景下，应优先选择Redis。它特别适用于电商、社交网络等大规模分布式系统。</div>
          </div>
          <div class="card-source">来源: 选择建议 - 3. Redis：分布式、高可用、持久化缓存</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在Redis的高可用架构中，哨兵（Sentinel）机制扮演了什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis Sentinel是一个用于管理主从复制架构的高可用性方案。它主要提供三个功能：1. 监控：检测Redis主从实例是否正常运行。2. 自动故障转移：当主节点故障时，自动将一个从节点提升为新的主节点。3. 通知功能：当出现故障时可以发送通知给管理员或其它程序。</div>
          </div>
          <div class="card-source">来源: Redis - 3.2 哨兵（Sentinel）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Redis支持的五种主要数据结构是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到的Redis支持的五种主要数据结构是：字符串（String）、哈希（Hash）、列表（List）、集合（Set）以及有序集合（Sorted Set）。</div>
          </div>
          <div class="card-source">来源: Redis - 2. Redis 的主要数据结构</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">对比</div>
          <div class="card-question">与Guava Cache和Caffeine相比，Redis在数据安全方面最显著的优势是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">对比</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Redis在数据安全方面最显著的优势是支持持久化。Guava Cache和Caffeine都是纯内存缓存，系统重启后数据会全部丢失。而Redis提供了RDB和AOF两种持久化方式，能够将数据保存到磁盘，确保在系统崩溃或重启后可以恢复数据，可靠性更高。</div>
          </div>
          <div class="card-source">来源: Guava Cache vs Caffeine vs Redis对比 - 6. 持久化与数据安全</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
